# -*- coding: utf-8 -*-
"""
Created on Fri Feb  1 23:16:14 2019
python3.6.3
Anaconda->spyder
opencv3.4.5
代码参考《OpenCV3计算机视觉 Python语言实现》（第二版）
@author: Administrator
"""

import cv2
import numpy as np

img = cv2.imread('pycv.png') 
#把彩图转化为灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img2 = cv2.medianBlur(gray,5)
#cimg = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR) #多余的

'''这些参数的数据设置的不合理会耗费很长时间，可以适当多修改几次看哪个合适'''
'''minRadius=0,maxRadius=0一般设为0不会报错，设为其他数值得合适才不报错'''
"""
image:8位，单通道图像。如果使用彩色图像，需要先转换为灰度图像。
method：定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT。
dp：累加器分辨率与图像分辨率的反比。dp获取越大，累加器数组越小。
minDist：检测到的圆的中心，（x,y）坐标之间的最小距离。如果minDist太小，则可能导致检测到多个相邻的圆。如果minDist太大，则可能导致很多圆检测不到.
param1：用于处理边缘检测的梯度值方法。
param2：cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小，检测到的圈子越多。
minRadius：半径的最小大小（以像素为单位）。
maxRadius：半径的最大大小（以像素为单位）。
"""
circles = cv2.HoughCircles(img2,cv2.HOUGH_GRADIENT,1,120,param1=100,param2 = 30,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))
circles1 = circles[0,:,:]

#或者for i in circles[0，:]:
for i in circles1[:]:
    #draw the outer circle
    cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)    
    #draw the center of the circle
    cv2.circle(img,(i[0],i[1]),5,(0,0,255),3)
"""优化方向：
找出最大的圆，
小圆圆心在圆内并且半径没能超出大圆外多少距离就去除

数组元素删除方法：numpy.delete(arr, obj, axis=None)
"""

cv2.imshow('lines',img)
cv2.waitKey()
cv2.destroyAllWindows()